From 8fd2e874a3f6a71977cd47a89e1edc88968a18c3 Mon Sep 17 00:00:00 2001 From: "akw27@boulderdash.cl.cam.ac.uk" Date: Wed, 29 Jan 2003 08:59:21 +0000 Subject: [PATCH] bitkeeper revision 1.15.3.1 (3e3797e9gMcow8ShTTrYuWSeSSe-BA) protect free_list with a spin lock. --- xen-2.4.16/common/domain.c | 5 +++++ xen-2.4.16/common/memory.c | 4 ++++ xen-2.4.16/include/xeno/mm.h | 2 ++ 3 files changed, 11 insertions(+) diff --git a/xen-2.4.16/common/domain.c b/xen-2.4.16/common/domain.c index 1128cdfa15..fc71bad3ef 100644 --- a/xen-2.4.16/common/domain.c +++ b/xen-2.4.16/common/domain.c @@ -334,10 +334,13 @@ static unsigned int alloc_new_dom_mem(struct task_struct *p, unsigned int kbytes struct pfn_info *pf, *pf_head; unsigned int alloc_pfns; unsigned int req_pages; + unsigned long flags; /* how many pages do we need to alloc? */ req_pages = kbytes >> (PAGE_SHIFT - 10); + spin_lock_irqsave(&free_list_lock, flags); + /* is there enough mem to serve the request? */ if(req_pages > free_pfns) return -1; @@ -369,6 +372,8 @@ static unsigned int alloc_new_dom_mem(struct task_struct *p, unsigned int kbytes free_pfns--; } + + spin_unlock_irqrestore(&free_list_lock, flags); p->tot_pages = req_pages; diff --git a/xen-2.4.16/common/memory.c b/xen-2.4.16/common/memory.c index 2e6697a0b8..8cbed41416 100644 --- a/xen-2.4.16/common/memory.c +++ b/xen-2.4.16/common/memory.c @@ -206,6 +206,7 @@ unsigned long frame_table_size; unsigned long max_page; struct list_head free_list; +spinlock_t free_list_lock = SPIN_LOCK_UNLOCKED; unsigned int free_pfns; static int tlb_flush[NR_CPUS]; @@ -219,6 +220,7 @@ void __init init_frametable(unsigned long nr_pages) { struct pfn_info *pf; unsigned long page_index; + unsigned long flags; memset(tlb_flush, 0, sizeof(tlb_flush)); @@ -232,6 +234,7 @@ void __init init_frametable(unsigned long nr_pages) memset(frame_table, 0, frame_table_size); /* Put all domain-allocatable memory on a free list. */ + spin_lock_irqsave(&free_list_lock, flags); INIT_LIST_HEAD(&free_list); for( page_index = (MAX_MONITOR_ADDRESS + frame_table_size) >> PAGE_SHIFT; page_index < nr_pages; @@ -240,6 +243,7 @@ void __init init_frametable(unsigned long nr_pages) pf = list_entry(&frame_table[page_index].list, struct pfn_info, list); list_add_tail(&pf->list, &free_list); } + spin_unlock_irqrestore(&free_list_lock, flags); } diff --git a/xen-2.4.16/include/xeno/mm.h b/xen-2.4.16/include/xeno/mm.h index 30071e76cf..3d014f650b 100644 --- a/xen-2.4.16/include/xeno/mm.h +++ b/xen-2.4.16/include/xeno/mm.h @@ -7,6 +7,7 @@ #include #include #include +#include /* XXX KAF: These may die eventually, but so many refs in slab.c :((( */ @@ -110,6 +111,7 @@ typedef struct pfn_info { extern frame_table_t * frame_table; extern unsigned long frame_table_size; extern struct list_head free_list; +extern spinlock_t free_list_lock; extern unsigned int free_pfns; extern unsigned long max_page; void init_frametable(unsigned long nr_pages); -- 2.30.2